/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import com.ipartek.formacion.gestformwww.modelo.beans.CandConv;
import com.ipartek.formacion.gestformwww.modelo.beans.Empresa;
import com.ipartek.formacion.gestformwww.modelo.beans.Entrega;
import com.ipartek.formacion.gestformwww.modelo.beans.Estado;
import com.ipartek.formacion.gestformwww.modelo.beans.Procedencia;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IEntregaDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.*;

/**
 * Clase que contiene los metodos para gestionar Entrega en la BBDD
 * @author Jorge-Jon
 */
public class SQLServerEntregaDAO implements IEntregaDAO {

    private static ResourceBundle rb;

    public SQLServerEntregaDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Metodo que busca un registro de Entrega con las IDs de curso y libro especificados
     * @param curId ID de Curso
     * @param libId ID del libro
     * @throws GestorFormacionExcepcion
     */
    public Entrega buscarEntrega(int curId, int libId) throws GestorFormacionExcepcion {
        Entrega entrega = new Entrega();
        String sentencia = "";
        Connection con=null;
        ResultSet rs=null;
        PreparedStatement stmt = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT EntFcha,EntConfirmado,CurId,EntId,LibId, "
                    + "PedId, Pedir, Cantidad,Observaciones,EstPedido "
                    + "FROM ENTREGA"
                    + " WHERE CurId=? AND LibId=?";
           
            stmt = con.prepareStatement(sentencia);
            stmt.setInt(1,curId);
            stmt.setInt(2,libId);
            rs= stmt.executeQuery();
            while (rs.next()) {
                entrega.setEntFecha(rs.getTimestamp("Entfcha"));
                if (rs.getInt("EntConfirmado") == 1) {
                    entrega.setEntConfirmado(true);
                } else {
                    entrega.setEntConfirmado(false);
                }
                entrega.setCurId(rs.getInt("CurId"));
                entrega.setLibId(rs.getInt("LibId"));
                entrega.setEntId(rs.getInt("EntId"));
                entrega.setPedId(rs.getInt("PedId"));
                if (rs.getInt("Pedir") == 1) {
                    entrega.setPedir(true);
                } else {
                    entrega.setPedir(false);
                }
                entrega.setCantidad(rs.getInt("Cantidad"));
                entrega.setObservaciones(rs.getString("Observaciones"));
                entrega.setEstPedido(rs.getInt("EstPedido"));

            }
            return entrega;
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            try {
                rs.close();
                SQLServerDAOFactory.desconecta(con);
            } catch (SQLException ex) {
                Logger.getLogger(SQLServerEntregaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
           
        }
    }

    /**
     * inserta un objeto entrega en la tabla Entrega
     * @param entrega
     * @throws GestorFormacionExcepcion
     */
    public void insertarEntrega(Entrega entrega) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "INSERT INTO ENTREGA (Entfcha, EntConfirmado, CurId, LibId, "
                    + "PedId, Pedir, Cantidad ,Observaciones ,EstPedido)"
                    + " VALUES (?,?,?,?,?,?,?,?,?)";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setTimestamp(1, entrega.getEntFecha());
            if (entrega.isEntConfirmado()) {
                stmt.setInt(2, 1);
            } else {
                stmt.setInt(2, 0);
            }
            stmt.setInt(3, entrega.getCurId());
            stmt.setInt(4, entrega.getLibId());
            stmt.setInt(5, entrega.getPedId());
            if (entrega.isPedir()) {
                stmt.setInt(6, 1);
            } else {
                stmt.setInt(6, 0);
            }
            stmt.setInt(7, entrega.getCantidad());
            stmt.setString(8, entrega.getObservaciones());
            stmt.setInt(9, entrega.getEstPedido());
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * dado un objeto entrega modifica el registro en la BBDD
     * @param entrega
     * @throws GestorFormacionExcepcion
     */
    public void modificarEntrega(Entrega entrega) throws GestorFormacionExcepcion {
        //CandConv candConv = new CandConv();
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
//            sentencia = "UPDATE Entrega SET Entfcha = ?, EntConfirmado = ?, CurId = ?,LibId=?, "
//                    + "PedId = ?, Pedir = ?, Cantidad = ?,Observaciones=?,EstPedido=?"
//                    + " WHERE CurId = " + entrega.getCurId()
//                    + " AND EntId = " + entrega.getEntId();

            sentencia = "UPDATE Entrega SET Entfcha = ?, EntConfirmado = ?, CurId = ?,LibId=?, "
                    + "PedId = ?, Pedir = ?, Cantidad = ?,Observaciones=?,EstPedido=?"
                    + " WHERE CurId = " + entrega.getCurId()
                    + " AND EntId = " + entrega.getEntId();


            PreparedStatement stmt = con.prepareStatement(sentencia);

            stmt.setTimestamp(1, entrega.getEntFecha());
            if (entrega.isEntConfirmado()) {
                stmt.setInt(2, 1);
            } else {
                stmt.setInt(2, 0);
            }
            stmt.setInt(3, entrega.getCurId());
            stmt.setInt(4, entrega.getLibId());
            stmt.setInt(5, entrega.getPedId());
            if (entrega.isPedir()) {
                stmt.setInt(6, 1);
            } else {
                stmt.setInt(6, 0);
            }
            stmt.setInt(7, entrega.getCantidad());
            stmt.setString(8, entrega.getObservaciones());
            stmt.setInt(9, entrega.getEstPedido());
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * Elimina un registro en la tabla entrega dado su cusId y libId
     * @param curId
     * @param libId
     * @throws GestorFormacionExcepcion
     */
    public void eliminarEntrega(int curId, int libId) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "DELETE FROM Entrega WHERE curId = ? AND libId = ?";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, curId);
            stmt.setInt(2, libId);
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * Elimina un registro en la tabla entrega dado su EntId
     * @param entId
     * @throws GestorFormacionExcepcion
     */
    public void eliminarEntrega(int entId) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "DELETE FROM Entrega WHERE entId = ?";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, entId);
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }
    
     /**
     * Elimina un registro en la tabla entrega dado su EntId
     * @param entId
     * @throws GestorFormacionExcepcion
     */
    public void eliminarEntregaLibro(int libId) throws GestorFormacionExcepcion {
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            sentencia = "DELETE FROM Entrega WHERE libId = ?";
            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, libId);
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }



    /**
     * devuelve un array de entregas con las entregas de la BBDD cuyo curId coincida con el dado.
     * @param curId
     * @return
     * @throws GestorFormacionExcepcion
     */
    public ArrayList<Entrega> listaEntregas(int curId) throws GestorFormacionExcepcion {
        ArrayList<Entrega> listaEntregas = new ArrayList();
        Entrega miEntrega = null;
        String sentencia = "";
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT Entfcha, EntConfirmado, CurId, EntId, Entrega.LibId, "
                    + "Entrega.PedId, Pedir, Cantidad,Observaciones,EstPedido,ISBN,LibTitulo,LibCantidadAlu "
                    + "FROM Entrega,Libro "
                    + "WHERE CurId=? and Entrega.LibId=Libro.LibId";

            PreparedStatement stmt = con.prepareStatement(sentencia);
            stmt.setInt(1, curId);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                miEntrega = new Entrega();

                miEntrega.setEntFecha(rs.getTimestamp("Entfcha"));
                if (rs.getInt("EntConfirmado") == 1) {
                    miEntrega.setEntConfirmado(true);
                } else {
                    miEntrega.setEntConfirmado(false);
                }
                miEntrega.setCurId(rs.getInt("CurId"));
                miEntrega.setLibId(rs.getInt("LibId"));
                miEntrega.setEntId(rs.getInt("EntId"));
                miEntrega.setPedId(rs.getInt("PedId"));
                if (rs.getInt("Pedir") == 1) {
                    miEntrega.setPedir(true);
                } else {
                    miEntrega.setPedir(false);
                }
                miEntrega.setCantidad(rs.getInt("Cantidad"));
                miEntrega.setObservaciones(rs.getString("Observaciones"));
                miEntrega.setEstPedido(rs.getInt("EstPedido"));
                miEntrega.setISBN(rs.getString("ISBN"));
                miEntrega.setTitulo(rs.getString("LibTitulo"));
                miEntrega.setStock(rs.getInt("LibCantidadAlu"));

                listaEntregas.add(miEntrega);

            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
            return listaEntregas;
        }
    }

    public Entrega getEntrega(int entId) throws GestorFormacionExcepcion {

        Entrega entrega = new Entrega();
        String sentencia = "";
        Connection con=null;
        ResultSet rs=null;
        PreparedStatement stmt = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            sentencia = "SELECT EntFcha,EntConfirmado,CurId,EntId,LibId, "
                    + "PedId, Pedir, Cantidad,Observaciones,EstPedido "
                    + "FROM ENTREGA"
                    + " WHERE EntId=?";

            stmt = con.prepareStatement(sentencia);
            stmt.setInt(1,entId);
            rs= stmt.executeQuery();
            while (rs.next()) {
                entrega.setEntFecha(rs.getTimestamp("Entfcha"));
                if (rs.getInt("EntConfirmado") == 1) {
                    entrega.setEntConfirmado(true);
                } else {
                    entrega.setEntConfirmado(false);
                }
                entrega.setCurId(rs.getInt("CurId"));
                entrega.setLibId(rs.getInt("LibId"));
                entrega.setEntId(rs.getInt("EntId"));
                entrega.setPedId(rs.getInt("PedId"));
                if (rs.getInt("Pedir") == 1) {
                    entrega.setPedir(true);
                } else {
                    entrega.setPedir(false);
                }
                entrega.setCantidad(rs.getInt("Cantidad"));
                entrega.setObservaciones(rs.getString("Observaciones"));
                entrega.setEstPedido(rs.getInt("EstPedido"));

            }
            return entrega;
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandConvDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            try {
                rs.close();
                SQLServerDAOFactory.desconecta(con);
            } catch (SQLException ex) {
                Logger.getLogger(SQLServerEntregaDAO.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}
